Chyba v pouziti exportovane funkce z DLL

Otázka od: David Kopecek

14. 11. 2003 9:39

Zdravim delphare  

mam aplikaci ktera si natahne DLL a zavola funkcni uvnitr one DLL, ale mam tam
jednu funkci ktera ma navracet data a nejak mi to stale pri zavolani pada.

tu dll mam naprogramovanou takto

uses
  Sysutils, Windows,classes;

function GetDomainSMTPConfig(strDomain : pchar): Pchar; stdcall;

exports
    GetDomainSMTPConfig;

implementation

function GetDomainSMTPConfig(strDomain : pchar): PChar; stdcall;
begin
 GetDomainSMTPConfig:=Pchar(':::');
end;

end.

samotne pripojeni na onou DLL v aplikaci provadim takto:
kdyz vsak zavolam

strString := _GetDomainSMTPConfig("idnes.cz"); tak mi to zhavaruje s chybou..
pokud onou hodnotu co mi to ma navratit narvu do Pchar tak je to vpohode ale
stejnak stem
datama v pchar nemuzu pracovat protoze to zase padne. Kdyz navracim boolean tak
to pres tu
dll jede v pohode ale jakmile chci nejaky data tak nic.. nevite nekdo v cem by
mohl byt problem ?


type
  TGetDomainSMTPConfig = function(strDomain : pchar): PChar; stdcall;

var
  GetDomainSMTPConfig:TGetDomainSMTPConfig;

Function _GetDomainSMTPConfig(strDomain : pchar): Pchar;

implementation

Function _GetDomainSMTPConfig(strDomain:Pchar):Pchar;
var
  hDllInst: THandle;
begin
  result:='';
  hDllInst := LoadLibrary('SDP.dll');
  if hDllInst <= 0 then
    Raise Exception.Create('[LoadLibrary Fail] GetLastError reports: '+
                            IntToStr(GetLastError));
  try
    @GetDomainSMTPConfig := GetProcAddress(hDllInst,'GetDomainSMTPConfig');
    if not Assigned(GetDomainSMTPConfig) then
      Raise Exception.Create('[GetProcAddress Fail] GetLastError reports: '+
                              IntToStr(GetLastError));

     result:=GetDomainSMTPConfig(strDomain);

  finally
    FreeLibrary(hDllInst);
  end;

end;
end.








----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)

Odpovedá: Petr Brant

14. 11. 2003 10:09

Videl bych to patrne na nealokovanou pamet. Mas nekde napsano

var strDomain: array[0..255] of char resp. neco podobneho? Nemam bohuzel cas
tvuj kod prilis zkoumat, takze sorry, pokud jsem to prehledl. Druha vec:
Nepovazuji za stastne, kdyz funkce vraci PChar. Vraci pointer na retezec,
otazkou je, kdo ma retezec alokovat. Cesta ven: misto funkce pouzit
proceduru napr. s hlavickou

procedure GetDomainSMTPConfig(strDomain : pchar; Vysledek: PChar);
//je zbytecne psat var Vysledek: PChar

a predavat do ni ukazatele na JIZ ALOKOVANOU pamet (DULEZITE !!!). Takze
napriklad

var strDomain, Vysledek: array[0..255] of char;
begin
 strDomain:= ....
 GetDomainSMTPConfig(strDomain, Vysledek);
....a tady uz muzes s vysledkem pracovat...

Zdravim a preji uspech

RNDr. Petr Brant [brant@dcomm.cz]
http://web.redbox.cz/petr.brant

D&COMM s.r.o.
Korunovacni 6
Praha 7
tel. +420724007234


 mam aplikaci ktera si natahne DLL a zavola funkcni uvnitr one DLL,
ale mam tam
 jednu funkci ktera ma navracet data a nejak mi to stale pri zavolani
pada.

 tu dll mam naprogramovanou takto

 uses
   Sysutils, Windows,classes;

 function GetDomainSMTPConfig(strDomain : pchar): Pchar; stdcall;

 exports
     GetDomainSMTPConfig;

 implementation

 function GetDomainSMTPConfig(strDomain : pchar): PChar; stdcall;
 begin
  GetDomainSMTPConfig:=Pchar(':::');
 end;

 end.

 samotne pripojeni na onou DLL v aplikaci provadim takto:
 kdyz vsak zavolam

 strString := _GetDomainSMTPConfig("idnes.cz"); tak mi to zhavaruje s
chybou..
 pokud onou hodnotu co mi to ma navratit narvu do Pchar tak je to
vpohode ale stejnak stem
 datama v pchar nemuzu pracovat protoze to zase padne. Kdyz navracim
boolean tak to pres tu
 dll jede v pohode ale jakmile chci nejaky data tak nic.. nevite
nekdo v cem by mohl byt problem ?


 type
   TGetDomainSMTPConfig = function(strDomain : pchar): PChar;
stdcall;

 var
   GetDomainSMTPConfig:TGetDomainSMTPConfig;

 Function _GetDomainSMTPConfig(strDomain : pchar): Pchar;

 implementation

 Function _GetDomainSMTPConfig(strDomain:Pchar):Pchar;
 var
   hDllInst: THandle;
 begin
   result:='';
   hDllInst := LoadLibrary('SDP.dll');
   if hDllInst <= 0 then
     Raise Exception.Create('[LoadLibrary Fail] GetLastError reports:
'+
                             IntToStr(GetLastError));
   try
     @GetDomainSMTPConfig :=
GetProcAddress(hDllInst,'GetDomainSMTPConfig');
     if not Assigned(GetDomainSMTPConfig) then
       Raise Exception.Create('[GetProcAddress Fail] GetLastError
reports: '+
                               IntToStr(GetLastError));

      result:=GetDomainSMTPConfig(strDomain);

   finally
     FreeLibrary(hDllInst);
   end;

 end;
 end.




----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)

Odpovedá: Rostislav Lekes

14. 11. 2003 11:58

Cau, s timhle jsem bojoval hodne dlouho a nakonec jsem to zprovoznil.
Problem je ve sdileni pameti mezi aplikaci a knihovnou (viz help).
Zkusil jsem to obslehnout z nejakych prikladu a metodou pokus omyl jsem to
privedl do tohoto stavu. Proc to ale takto funguje a jinak ne, to opravdu
nevim  
Snad z toho neco vyctes. Ciste reseni to asi moc neni, v helpu doporucuji
pouzit nejakou unitu (nebo knihovnu) na sdileni pameti, ale to jsem
nezkousel, resp.jenom chvilku a nerozchodil jsem to ....
Rosta

library DatamaxIClass;
uses
  SysUtils,
  Classes;
{$R *.RES}
Function ZpracujVstupenku(TiskParam:TStringList):PChar;
var
 TiskRetez : String;
begin
TiskRetez:='.....';
Result := PChar(TiskRetez);
end;
Exports
  ZpracujVstupenku;
begin
end.

z aplikace :

Type
  TZpracujVstupenku = Function(TiskParam:TStringList):PChar;

var
  ProTisk:String;
  JmenoTiskarny:String; // jmeno dll
  Knihovna : Integer;
  ZpracujVstupenku : TZpracujVstupenku;
  List : TStringList;

begin
******
Knihovna := LoadLibrary(PCHAR(JmenoTiskarny)); // Natahne prislusnou
knihovnu
@ZpracujVstupenku := GetProcAddress(Knihovna, 'ZpracujVstupenku');
ProTisk:= ZpracujVstupenku(List);
FreeLibrary(Knihovna);
******
end;


----- Original Message -----
From: "David Kopecek" <david.kopecek@hacktrack.com>
To: <delphi-l@clexpert.cz>
Sent: Friday, November 14, 2003 9:16 AM
Subject: Chyba v pouziti exportovane funkce z DLL


> Zdravim delphare  
>
> mam aplikaci ktera si natahne DLL a zavola funkcni uvnitr one DLL, ale mam
tam
> jednu funkci ktera ma navracet data a nejak mi to stale pri zavolani pada.
>
> tu dll mam naprogramovanou takto
>
> uses
> Sysutils, Windows,classes;
>
> function GetDomainSMTPConfig(strDomain : pchar): Pchar; stdcall;
>
> exports
> GetDomainSMTPConfig;
>
> implementation
>
> function GetDomainSMTPConfig(strDomain : pchar): PChar; stdcall;
> begin
> GetDomainSMTPConfig:=Pchar(':::');
> end;
>
> end.
>
> samotne pripojeni na onou DLL v aplikaci provadim takto:
> kdyz vsak zavolam
>
> strString := _GetDomainSMTPConfig("idnes.cz"); tak mi to zhavaruje s
chybou..
> pokud onou hodnotu co mi to ma navratit narvu do Pchar tak je to vpohode
ale stejnak stem
> datama v pchar nemuzu pracovat protoze to zase padne. Kdyz navracim
boolean tak to pres tu
> dll jede v pohode ale jakmile chci nejaky data tak nic.. nevite nekdo v
cem by mohl byt problem ?
>
>
> type
> TGetDomainSMTPConfig = function(strDomain : pchar): PChar; stdcall;
>
> var
> GetDomainSMTPConfig:TGetDomainSMTPConfig;
>
> Function _GetDomainSMTPConfig(strDomain : pchar): Pchar;
>
> implementation
>
> Function _GetDomainSMTPConfig(strDomain:Pchar):Pchar;
> var
> hDllInst: THandle;
> begin
> result:='';
> hDllInst := LoadLibrary('SDP.dll');
> if hDllInst <= 0 then
> Raise Exception.Create('[LoadLibrary Fail] GetLastError reports: '+
> IntToStr(GetLastError));
> try
> @GetDomainSMTPConfig :=
GetProcAddress(hDllInst,'GetDomainSMTPConfig');
> if not Assigned(GetDomainSMTPConfig) then
> Raise Exception.Create('[GetProcAddress Fail] GetLastError reports:
'+
> IntToStr(GetLastError));
>
> result:=GetDomainSMTPConfig(strDomain);
>
> finally
> FreeLibrary(hDllInst);
> end;
>
> end;
> end.
>
>
>
>
>
>
>
>





----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)

Odpovedá: Vymazal Milan

14. 11. 2003 11:51

Cau

> Cau, s timhle jsem bojoval hodne dlouho a nakonec jsem to zprovoznil.
> Problem je ve sdileni pameti mezi aplikaci a knihovnou (viz help).
> Zkusil jsem to obslehnout z nejakych prikladu a metodou pokus omyl jsem to
> privedl do tohoto stavu. Proc to ale takto funguje a jinak ne, to opravdu
> nevim  
> Snad z toho neco vyctes. Ciste reseni to asi moc neni, v helpu doporucuji
> pouzit nejakou unitu (nebo knihovnu) na sdileni pameti, ale to jsem
> nezkousel, resp.jenom chvilku a nerozchodil jsem to ....
> Rosta

No jenze i tak to mam presne ja a nefunguje to

> library DatamaxIClass;
> uses
> SysUtils,
> Classes;
> {$R *.RES}
> Function ZpracujVstupenku(TiskParam:TStringList):PChar;
> var
> TiskRetez : String;
> begin
> TiskRetez:='.....';
> Result := PChar(TiskRetez);
> end;
> Exports
> ZpracujVstupenku;
> begin
> end.

> z aplikace :

> Type
> TZpracujVstupenku = Function(TiskParam:TStringList):PChar;

> var
> ProTisk:String;
> JmenoTiskarny:String; // jmeno dll
> Knihovna : Integer;
> ZpracujVstupenku : TZpracujVstupenku;
> List : TStringList;

> begin
> ******
> Knihovna := LoadLibrary(PCHAR(JmenoTiskarny)); // Natahne prislusnou
> knihovnu
> @ZpracujVstupenku := GetProcAddress(Knihovna, 'ZpracujVstupenku');
> ProTisk:= ZpracujVstupenku(List);
> FreeLibrary(Knihovna);
> ******
> end;


> ----- Original Message -----
> From: "David Kopecek" <david.kopecek@hacktrack.com>
> To: <delphi-l@clexpert.cz>
> Sent: Friday, November 14, 2003 9:16 AM
> Subject: Chyba v pouziti exportovane funkce z DLL


>> Zdravim delphare  
>>
>> mam aplikaci ktera si natahne DLL a zavola funkcni uvnitr one DLL, ale mam
> tam
>> jednu funkci ktera ma navracet data a nejak mi to stale pri zavolani pada.
>>
>> tu dll mam naprogramovanou takto
>>
>> uses
>> Sysutils, Windows,classes;
>>
>> function GetDomainSMTPConfig(strDomain : pchar): Pchar; stdcall;
>>
>> exports
>> GetDomainSMTPConfig;
>>
>> implementation
>>
>> function GetDomainSMTPConfig(strDomain : pchar): PChar; stdcall;
>> begin
>> GetDomainSMTPConfig:=Pchar(':::');
>> end;
>>
>> end.
>>
>> samotne pripojeni na onou DLL v aplikaci provadim takto:
>> kdyz vsak zavolam
>>
>> strString := _GetDomainSMTPConfig("idnes.cz"); tak mi to zhavaruje s
> chybou..
>> pokud onou hodnotu co mi to ma navratit narvu do Pchar tak je to vpohode
> ale stejnak stem
>> datama v pchar nemuzu pracovat protoze to zase padne. Kdyz navracim
> boolean tak to pres tu
>> dll jede v pohode ale jakmile chci nejaky data tak nic.. nevite nekdo v
> cem by mohl byt problem ?
>>
>>
>> type
>> TGetDomainSMTPConfig = function(strDomain : pchar): PChar; stdcall;
>>
>> var
>> GetDomainSMTPConfig:TGetDomainSMTPConfig;
>>
>> Function _GetDomainSMTPConfig(strDomain : pchar): Pchar;
>>
>> implementation
>>
>> Function _GetDomainSMTPConfig(strDomain:Pchar):Pchar;
>> var
>> hDllInst: THandle;
>> begin
>> result:='';
>> hDllInst := LoadLibrary('SDP.dll');
>> if hDllInst <= 0 then
>> Raise Exception.Create('[LoadLibrary Fail] GetLastError reports: '+
>> IntToStr(GetLastError));
>> try
>> @GetDomainSMTPConfig :=
> GetProcAddress(hDllInst,'GetDomainSMTPConfig');
>> if not Assigned(GetDomainSMTPConfig) then
>> Raise
Exception.Create('[GetProcAddress Fail] GetLastError reports:
> '+
>> IntToStr(GetLastError));
>>
>> result:=GetDomainSMTPConfig(strDomain);
>>
>> finally
>> FreeLibrary(hDllInst);
>> end;
>>
>> end;
>> end.
>>
>>
>>
>>
>>
>>
>>
>>







S pozdravem
  
 Milan Vymazal





----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)

Odpovedá: Dalibor Toman

14. 11. 2003 12:13

David Kopecek <david.kopecek@hacktrack.com> wrote:
> Zdravim delphare  
>
> uses
> Sysutils, Windows,classes;
>
> function GetDomainSMTPConfig(strDomain : pchar): Pchar; stdcall;
>
> exports
> GetDomainSMTPConfig;
>
> implementation
>
> function GetDomainSMTPConfig(strDomain : pchar): PChar; stdcall;
> begin
> GetDomainSMTPConfig:=Pchar(':::');
> end;
>
> end.
>
>
> type
> TGetDomainSMTPConfig = function(strDomain : pchar): PChar;
> stdcall;
>
> var
> GetDomainSMTPConfig:TGetDomainSMTPConfig;
>
> Function _GetDomainSMTPConfig(strDomain : pchar): Pchar;
>
> implementation
>
> Function _GetDomainSMTPConfig(strDomain:Pchar):Pchar;
> var
> hDllInst: THandle;
> begin
> result:='';
> hDllInst := LoadLibrary('SDP.dll');
> if hDllInst <= 0 then
> Raise
Exception.Create('[LoadLibrary Fail] GetLastError
> reports: '+
IntToStr(GetLastError));
> try
> @GetDomainSMTPConfig :=
> GetProcAddress(hDllInst,'GetDomainSMTPConfig'); if not
> Assigned(GetDomainSMTPConfig) then Raise
>
Exception.Create('[GetProcAddress
> Fail] GetLastError reports: '+
IntToStr(GetLastError));
>
> result:=GetDomainSMTPConfig(strDomain);
>
> finally
> FreeLibrary(hDllInst);
> end;
>
> end;

problem je ten, ze po FreeLibrary() ukazuje Result na pamet, ktera jiz
neexistuje.

Musis to udelat tak, ze do funkce zknihovny predas buffer alokovany v
aplikaci - napriklad takhle:

function GetDomainSMTPConfig(strDomain : pchar; ResultBuff : Pointer;
BuffSize : Integer): Boolean; stdcall;

ci nejak podobne.

Zdravi
Dalibor Toman






----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)

Odpovedá: Rostislav Lekes

14. 11. 2003 12:30

Nemas to presne , parametr fce mas PChar, ja tam posilam cely StringList,
takze v tvem pripade by to asi mel byt asi String. Me to zatim chodi bez
problemu.

> No jenze i tak to mam presne ja a nefunguje to





----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)